//
// Created by zhangJA on 2020/6/23.
//自定义类型：
//类型别名：为已有类型另外命名
/*------------[1]typedef  已有类型名  新类型名表<C>------------/
eg:
 typedef double Area,Volume;
typedef int Natural;
Natural i1,i2;
Area a;
Volume v;
*/

/*------------[2]using  新类型名  =  已有类型名<C++>------------/
eg:
using Area1=double
using Volume1=double
*/

//以上都是预定义类型,但有时需要自定义类型（eg.枚举类型）
/*------------[3]enum  枚举类型名  {变量值列表}-----------------/
eg:
enum Weekday{SUN,MON,TUS,WED,THU,FRI,SAT}
// 默认情况下,SUN=0,MON=1,TUS=2......,SAT=6

//以上为不限定作用域枚举类型，限定在后面介绍
//1.枚举元素是常量，不能对它们赋值
//2.枚举元素具有默认值，它们以此为：1,2,3...
//3.也可以在声明时另行指定枚举元素的值
//4.枚举值可以进行关系运算
//5.整数值不能直接赋给枚举变量，若需要讲整数赋值给枚举变量，应进行强制类型转换
*/


#include <iostream>
using namespace std;
enum GameResult{WIN,LOSE,TIE,CANCEL};//定义枚举类型GameResult
int main()
{
    GameResult result;
    enum GameResult omit=CANCEL;//定义omit枚举变量并赋初始值
    for(int count=WIN;count<=CANCEL;count++)
    {
        result=GameResult(count);//强制类型转化
        if(result==omit)
            cout<<"The game was cancelled"<<endl;
        else
        {
            cout<<"The game was played";
            if(result==WIN)cout<<"and we won!";
            if(result==LOSE)cout<<"and we lost.";
            cout<<endl;
        }
    }
}

//auto类型与decltype类型
//auto:编译器通过初始值自动推断变量的类型
//eg:
//auto val=val1+val2<如果val1、val2是int,则val也是int;如果val1、val2是double,则val也是double>

//decltype类型：定义一个变量与某一表达式的类型相同，但并不用该表达式初始化变量
//eg:
//decltype(i)j=2;<表示j以为初始值，类型与i一致>